#include <bits/stdc++.h>
using namespace std;
typedef struct{
    int life, times;
}Enemy;

int main(){
    int n, m, k;
    cin>>n>>m>>k;
    //enemies[i] 表示如果能击败所有类型的敌人（每种一个），i类型对应恢复的血量
    Enemy enemies[k + 1];
    for(int i = 0; i < k + 1; i++) enemies[i] = {0, 1};
    //记录每种类型的敌人中最小的打击次数 hitTimes[i] 代表 i类型敌人需要打击的次数
    int hitTimes[k + 1];
    for(int i = 1; i < k + 1; i++)  hitTimes[i] = INT_MAX;
    int h, t, c;
    for(int i = 0; i < n; i++){
        cin>>h>>t>>c;
        //每种类型取最小打击次数
        if(t < hitTimes[c]) hitTimes[c] = t;
        //生命比上打击数越大，能保证恢复更多的血
        float rate = h * 1.0 / t;
        if(rate > enemies[c].life * 1.0 / enemies[c].times){
            enemies[c] = {h, t};
        }
    }
    int *hitTime = max_element(hitTimes + 1, hitTimes + k);
    int increaseLife = INT_MAX;
    //恢复的生命值为每种类型中生命值最小的
    for(int i = 1; i < k + 1; i++)  increaseLife = min(increaseLife, enemies[i].life);

    if(*hitTime > m){   //不能
        cout<<"-1";
    }else{  //能
        //这里打击次数需要再取不大于m的最大值(部分情况通不过)
        for(int i = 1; i < k + 1; i++){
            if(enemies[i].times > *hitTime && enemies[i].times <= m){
                *hitTime = enemies[i].times;
            }
        }
        cout<<(m - *hitTime + increaseLife);
    }

    return 0;
}
/*

题目描述
血魔遇到了N个敌人。初始血魔生命值为M，每秒钟血魔的生命值会减少1。
如果血魔的生命值变为0，血魔会立刻消失，但在此之前他可以击杀敌人来恢复生命值。
对于第i个敌人需要攻击Ti次才能杀死，血魔每秒钟可以攻击一次，每秒钟血魔可以攻击任意一个敌人，
并且每次攻击可以同时击中任意多个敌人。敌人一共有K种类型，对于每种类型的敌人，血魔最多只能杀死一个。
血魔在进行过所有攻击后，他可以立刻恢复他所杀死敌人的最小生命值，
在恢复过后不能再继续进行攻击（如果血魔生命值变为0的瞬间恢复生命值，血魔不会死亡）。
现在血魔想知道，他是否能杀死K个敌人，如果能的话，那么杀死K个敌人后，生命值最高能为多少？

输入说明
第一行3个整数N，M，K，分别表示敌人数量，血魔初始的生命值，敌人类型数。

接下来N行，每行三个整数Hi，Ti，Ci，分别表示第i个敌人的生命值，需要攻击的次数和类型。

1 <= Ci <= K <= N <= 105

1 <= Hi，Ti，M <= 109

保证每种类型的敌人至少有一个。

输出说明
如果不能杀死K个敌人输出-1，否则输出生命值最大值。

输入样例
样例1

2 5 2

1 2 2

4 5 1

样例2：

5 4 2

4 2 1

1 1 1

4 1 1

3 2 2

1 1 2

样例3：

3 5 3

5 2 1

1 6 2

3 2 3

输出样例
样例1：

1

样例2：

5

样例3:

-1
*/